package syf.ArrayQueueDemo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
/*          主要是想到空一格位置，相当于建立的长度和数组比实际的队伍大1
            然后判断出空时的条件和满时的条件
            使用(rear+1)%maxsize 使rear的值在maxsize的值之间循环
            例如maxsize=4则在0，1，2，3之间循环
* */
public class circleArrayQueue {
    public static void main(String[] args) {
        String config="applicationContext.xml";
        ApplicationContext ac=new ClassPathXmlApplicationContext(config);
        Array array= (Array) ac.getBean("array");
        array.adddate();
        array.deldate();
        array.adddate();
        array.adddate();
        array.adddate();
        array.deldate();
        array.deldate();
        array.deldate();
        array.adddate();
        array.adddate();
        array.adddate(); array.adddate();
        array.adddate(); array.adddate();
    }
}
@Component
class Array{
    private int max_size=4;
    private int rear=0;
    private int front=0;
    private int[] arr=new int[4];
    private int num=1;
    void adddate(){
        //rear的值始终在绕圈，不是不停的增长
        if (!((rear+1)%max_size==front)) {
            arr[rear]=num++;
            System.out.println("插入了一个目标"+arr[rear]);
            rear=(rear+1)%max_size;
        }
        else {
            show();
            throw new RuntimeException("队列已满，无法储存数据");
        }
    }
    void deldate(){

        if (rear!=front){
            int val;
            val=arr[front];arr[front]=0;
            front=(front+1)%max_size;
            System.out.println("删去了一个目标"+val);

        }
        else{
            throw new RuntimeException("队列已空，无法抛出数据");
        }
    }
    void show(){
        for (int i=front;i<front+size();i++){
            System.out.print(arr[i%max_size] +" ");
        }
    }
    int size(){
        return (rear+max_size-front)%max_size;
    }
}
